function MyEvents() {
    this.events = {};//存放事件监听函数
    this._maxListeners = 10;//一个事件类型增加的函数数量(默认最多10个)
}
MyEvents.prototype.on = MyEvents.prototype.addListener = function (type,listener) {
    if(this.events[type]){
        //如果有此事件，则将监听函数推入事件数组
        this.events[type].push(listener);
        if(this._maxListeners!=0 && this.events[type].length >= this._maxListeners){
            console.error('超出限制');
        }
    }else{
        this.events[type] = [listener];
    }
};
MyEvents.prototype.once = function (type,listener) {
    //只处理一次事件
    //wrapper用完一次就销毁
    function wrapper(...rest) {
        listener.apply(this,rest);
        this.removeListener(type,wrapper);
    }
    this.on(type,wrapper);
};
MyEvents.prototype.prependListener = function (type,listener) {
    //添加 listener 函数到名为type的事件的监听器数组的开头。不会检查 listener 是否已被添加。
    // 多次调用并传入相同的 type 和 listener 会导致 listener 被添加与调用多次。
    // 返回一个 EventEmitter 引用，可以链式调用
    if(this.events[type]){
        this.events[type].unshift(listener);
        if(this._maxListeners!=0 && this.events[type].length >= this._maxListeners){
            console.error('超出限制');
        };
    }else{
        this.events[type] = [listener];
    }
};
MyEvents.prototype.prependOnceListener = function (type,listener) {
    //添加一个单次 listener 函数到名为 type 的事件的监听器数组的开头。 下次触发 type 事件时，监听器会被移除，然后调用。返回一个 EventEmitter 引用，可以链式调用
    function prependWrapper(...rest) {
        listener.apply(rest);
        this.removeListener(type,prependWrapper);
    };
    this.prependListener(type,prependWrapper);
};
MyEvents.prototype.emit = function (type,...rest) {
    //按监听器的注册顺序，同步地调用名为type的事件监听器
    if(this.events[type]){
        this.events[type].forEach(listener => listener.apply(this,rest));
    };
};
MyEvents.prototype.eventNames = function () {
    //返回一个列出触发器已注册监听器的事件的数组
    //Reflect.ownKeys(obj)返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.
    return Reflect.ownKeys(this.events);
};
MyEvents.prototype.setMaxListeners = function (num) {
    //设置当前的最大监听器限制值
    this._maxListeners = num;
};
MyEvents.prototype.getMaxListeners = function () {
    //返回 EventEmitter 当前的最大监听器限制值
    return this._maxListeners;
};
MyEvents.prototype.listenerCount = function (type) {
    //返回正在监听名为 type的事件的监听器的数量。
    if(type){
        if(this.events[type]){
            return this.events[type].length;
        }else {
            return new Error('无此类型事件');
        }
    }else{
        return new Error('无事件名称');
    };
};
MyEvents.prototype.listeners = function (type) {
    //返回名为 type 的事件的监听器数组的副本。
    return this.events[type];
};
MyEvents.prototype.removeListener = function (type,listener) {
    if(this.events[type]){
        //如果当前迭代的项目如果不等于参数的话就保留，否则过滤掉
        //数组的filter用法
        this.events[type] = this.events[type].filter(l=>l!=listener);
    }
};
MyEvents.prototype.removeAllListeners = function (type) {
    //移除某个事件的所有监听函数
    delete this.events[type];
};
module.exports = MyEvents;